<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    //寄生式继承 继承原型
    //优点：避免了组合继承中调用两次父类构造函数的问题，

    //传递参数：subClass 子类
    //传递参数：superClass 父类
    // 原型式继承

    function inheritObject(o){
      //声明一个过渡函数对象
      function F(){}
      //过渡对象的原型继承父对象
      F.prototype = o;
      //返回过渡对象的一个实例，该对象的原型继承了父对象
      return new F();
    }
    //定义
    function inheritPrototype(subClass,superClass){
    //  复制一份父类的原型副本保存在变量中
      let p = inheritObject(superClass.prototype);
    //  因为在一开始用寄生式继承时，用的是父类的构造函数，
    //  如果不修改子类的构造函数的话，就只能修改父类的构造函数
    //  修正因为重写子类原型导致的constructor属性被修改
      p.constructor = subClass;
      //  设置子类的原型
      subClass.prototype = p;
    }

    //测试
    //  声明父类
    function SuperClass(name) {
      //  值类型共有属性
      this.name = name;
      //  引用类型共有属性
      this.books = ['a','b','c'];
    }

    //    父类原型共有方法
    SuperClass.prototype.getName = function (){
      console.log(this.name);
    }

    //    声明子类,这里是构造函数式，用来获取构造函数
    function SubClass(name,time){
      //  构造函数式继承父类name属性
      SuperClass.call(this,name);
      //  子类中新增共有属性
      this.time = time;
    }

    //    寄生式组合式继承
    inheritPrototype(SubClass,SuperClass)

    //    子类原型方法
    SubClass.prototype.getTime = function (){
      console.log(this.time)
    }


    //    测试代码
    let instance1 = new SubClass('js book',2014);
    instance1.books.push('test');
    console.log(instance1.books);
    instance1.getName();
    instance1.getTime();

    let instance2 = new SubClass('js book2',2016);
    instance2.books.push('test2');
    console.log(instance2.books);
    instance2.getName();
    instance2.getTime();


</script>
</body>
</html>
